/* 
  ES6中的箭头函数和扩展
    这节课开始，先不着急看ES6中的函数，而是回顾一下ES5中的函数写法。写一个函数，进行一个加法计算。

  function add(a,b){
    return a+b;
  }
  console.log(add(1,2));
  
  我们声明了一个add函数，然后传入a和b两个值，返回a+b的值。 然后我们在控制台打印了这个函数的返回结果，这里是3.

  ----------------------------------------------------------------------------------------------------

  默认值
    在ES6中给我们增加了默认值的操作，我们修改上边的代码，可以看到现在只需要传递一个参数也是可以正常运行的。
  
  function add(a,b=1){
    return a+b;
  }
  console.log(add(1));  

  ----------------------------------------------------------------------------------------------------

  主动抛出错误
    在使用Vue的框架中，可以经常看到框架主动抛出一些错误，比如v-for必须有:key值。那尤大神是如何做到的那？其实很简单，ES6中我们直接用throw new Error( xxxx ),就可以抛出错误。

  function add(a,b=1){
    if(a == 0){
        throw new Error('This is error')
    }
     return a+b;
  }
  console.log(add(0));

  ----------------------------------------------------------------------------------------------------

  函数中的严谨模式
    我们在ES中就经常使用严谨模式来进行编程，但是必须写在代码最上边，相当于全局使用。在ES6中我们可以写在函数体中，相当于针对函数来使用。

  function add(a,b=1){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
  }
  console.log(add(1));  
  上边的代码如果运行的话，你会发现浏览器控制台报错，这是ES6中的一个坑，如果没人指导的话，可能你会陷进去一会。这个错误的原因就是如果你使用了默认值，再使用严谨模式的话，就会有冲突，所以我们要取消默认值的操作，这时候你在运行就正常了。

  function add(a,b){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
  }
  console.log(add(1,2));

  ----------------------------------------------------------------------------------------------------

  获得需要传递的参数个数
    如果你在使用别人的框架时，不知道别人的函数需要传递几个参数怎么办？ES6为我们提供了得到参数的方法(xxx.length).我们用上边的代码看一下需要传递的参数个数。

  function add(a,b){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
  }
  console.log(add.length);
  这时控制台打印出了2，但是如果我们去掉严谨模式，并给第二个参数加上默认值的话，这时候add.length的值就变成了1， 也就是说它得到的是必须传入的参数。

  ----------------------------------------------------------------------------------------------------

  箭头函数
    在学习Vue的时候，我已经大量的使用了箭头函数，因为箭头函数真的很好用，我们来看一个最简单的箭头函数。也就是上边我们写的add函数，进行一个改变，写成箭头函数。

  var add =(a,b=1) => a+b;
  console.log(add(1));  

  {}的使用
    在箭头函数中，方法体内如果是两句话，那就需要在方法体外边加上{}括号。例如下边的代码就必须使用{}.
  
  var add =(a,b=1) => {
    console.log('jspang')
    return a+b;
  };
  console.log(add(1));  

  箭头函数中不可加new，也就是说箭头函数不能当构造函数进行使用。

  最后我还是要重复强调的是，你一定要动手敲一下代码，要不你是学不会的，在工作中的改变就是学习了ES6得语法，在写新项目的时候尽量使用ES6带来的便利和特点，这样才能快速成长。
*/

  // ES5中的函数
  function add(a,b,...amd){
    // console.log(amd.length);  //4
    return a+b; //3
  }
  // console.log(add(1,2,3,4,5,6));

  // es6 默认值
  function add2 (a=1,b){
    return a+b;  //NAN
  }
  // console.log(add2(3));   //如果实参里面,只传了一个值,默认是第一个值, 形参的取值是按照顺序取值的,传两个,就对应取值,,这个程序出现NAN,b没有值
  
  // 主动抛出错误
  function add3(a,b=1){
    if(a==0){
      throw new Error('这是一个错误');  //自定义报错
    }
    return a+b;
  }
  // console.log(add3(0));

  // 函数中的严谨模式
  // function add4(a,b=1){
  //   'use strict'
  //   if(a==0){
  //     throw new Error('这是一个错误');  //自定义报错
  //   }
  //   return a+b;
  // }
  // console.log(add4(0));  //无法编译,程序出错
  // 程序无法执行, 如果函数里面用了严格模式,不能使用形参默认值,去掉形参默认值,函数就正常了,这个ES6的一个坑

  // 获得需要传递的参数个数'
  function add5(a,b){
    'use strict'
    if(a==0){
      throw new Error('自定义一个错误');
    }
    return a+b;
  }
  // console.log(add5.length);  //2

  // 箭头函数
  let add6=(a=8,b)=>{
    return a+b;
  }
  // console.log(add6(null,6));  //6  如果形参使用了默认值,在用null ,则默认值为空了,









